package 集合框架.shousidaima;

import java.util.Arrays;

public class ArrayListDemo<E> implements ListDemo<E> {
    public static final int DEFAULT_SIZE = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    public Object[] elementData;
    public int size = 0;

    public ArrayListDemo() {
        this.elementData = EMPTY_ELEMENTDATA;
    }

    public void grow(int size){
        if (size == 0){
            this.elementData = new Object[DEFAULT_SIZE];//初始化数组大小为10。
            return;
        }
        int oldArrayLength = this.elementData.length;//获取旧数组长度。
        int newArrayLength = oldArrayLength + (oldArrayLength >> 1);//扩容为原来的1.5倍。
        this.elementData = Arrays.copyOf(this.elementData, newArrayLength);//扩展数组。
    }


    @Override
    public void add(Object o) {
        if (size == elementData.length) {
            grow(size);
        }
        this.elementData[size] = o;
        size++;
    }


    @Override
    public String toString() {
        StringBuilder str = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            str.append(this.elementData[i]).append(",");
            if (i == size - 1) {
                str.deleteCharAt(str.length() - 1);//处理最后面的逗号。
            }
        }
        str.append("]");
        return str.toString();
    }

    @Override
    public E get(int index) {
        if (index < 0 || index >= size){//判断索引是否在范围内。
            throw new IndexOutOfBoundsException("越界了!");//没在范围内，抛出异常。
        }
        return (E) this.elementData[index];//this.elementData[index]是Object类型，需要强转成E类型。
    }

    @Override
    public void add(int index, E e) {
        if (size == elementData.length) {
            grow(size);
        }
        if (index < 0 || index >= size){
            throw new IndexOutOfBoundsException("越界了!");
        }
        Object [] elementData = this.elementData;
        System.arraycopy(elementData, index, elementData, index + 1, size - index);//参数分别为源数组，源数组的起始位置，目标数组，目标数组的起始位置，复制的长度。
        elementData[index] = e;//将新元素添加到指定位置。
        size++;//元素数量+1。
    }

    @Override
    public void remove(int index) {
        if (index < 0 || index >= size){
            throw new IndexOutOfBoundsException("越界了!");
        }
        Object [] elementData = this.elementData;//获取数组引用。
        System.arraycopy(elementData, index + 1, elementData, index, size - index);
        elementData[size - 1] = null;
        size--;
    }

    @Override
    public int indexOf(E e) {
        for (int i = 0; i < size; i++) {
            if (e.equals(this.elementData[i])) {
                return i;
            }
        }
        return -1;
    }
}
